home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / this / this.asm next >
Encoding:
Assembly Source File  |  1993-07-08  |  10.0 KB  |  622 lines

  1. ;**************************************************
  2. ;    “THis”ファイル検索 V1.0d
  3. ;
  4. ;V1.0    92/05/13 18:35:34 ~ 92/05/14 00:17:08 (完成版)
  5. ;V1.0a    92/05/27 13:21:43 ~ 92/05/27 13:48:50 (ワイルドカード省略をサポート)
  6. ;V1.0b    92/06/06 14:04:57 ~ 92/06/06 14:18:28 (総検索数の表示)
  7. ;V1.0c    92/06/06 14:20:51 ~ 92/06/06 14:23:25 (隠し・システムファイル勘定)
  8. ;V1.0d    92/06/10          ~ 92/06/10          (PUT16BIT修正)
  9. ;**************************************************
  10.  
  11. IDEAL
  12. DOSSEG
  13. P8086
  14. JUMPS
  15.  
  16. CR    EQU    0DH,0AH
  17. NULL    EQU    00H
  18.  
  19. SEGMENT    CODE    "CODE"
  20.     ASSUME    CS:CODE,DS:CODE,ES:CODE,SS:CODE
  21.  
  22.     ORG    80H
  23. DTA:
  24.     ORG    100H
  25.  
  26. ;****************************************
  27. ;    初期ルーチン
  28. ;
  29. ;
  30. ;****************************************
  31.  
  32. ENTRY:
  33.     CLD
  34.  
  35.     MOV    DI,OFFSET RETURN
  36.     CALL    ASCIIZPUTS        ;改行しておく
  37.  
  38.     MOV    AX,CS
  39.     MOV    DS,AX
  40.     MOV    ES,AX            ;セグメント合わせ
  41.  
  42.     CALL    GETCMD            ;コマンドラインを読み取る
  43.  
  44.     CMP    DX,0FFFFH
  45.     JNE    PIN            ;ファイル名とおぼしきものがあったら
  46.  
  47.     MOV    DX,OFFSET DIR
  48. PIN:
  49.     CALL    WAKERU
  50.  
  51. MAIN:
  52.     MOV    BX,OFFSET RNDBUF    ;バッファ位置指定
  53.     CALL    SIR            ;検索本体へ
  54.  
  55.     CMP    [WORD LOOKFOR],00H
  56.     JE    NOFILE
  57.  
  58.     CALL    E_PUTS
  59.  
  60.     MOV    AL,0            ;正常終了
  61.  
  62. ;****************************************
  63. ;    終了ルーチン
  64. ;****************************************
  65. FIN:
  66.     MOV    AH,4CH
  67.     INT    21H            ;終わり
  68.  
  69. ;****************************************
  70. ;    ファイルが無い時のメッセージ
  71. ;****************************************
  72. NOFILE:
  73.     MOV    AH,09H
  74.     MOV    DX,OFFSET NOF_MES
  75.     INT    21H            ;メッセージ表示
  76.  
  77.     MOV    AL,1
  78.     JMP    FIN            ;終わり
  79.  
  80. ;****************************************
  81. ;    コマンドライン読み取り
  82. ;
  83. ;IN    COMMAND LINE
  84. ;OUT    DX,CMDPOINTER,COMMAND LINE
  85. ;BREAK    BX,SI,DI,BP
  86. ;****************************************
  87. PROC    GETCMD
  88.  
  89.     MOV    SI,81H            ;移し元ポインタ(双方とも、)
  90.     XOR    BP,BP            ;ポインタのポインタ
  91.     JMP    GETCMD4
  92.  
  93. GETCMDP:
  94.     MOV    [WORD CMDPOINTER+BP],SI
  95.     INC    BP
  96.     INC    BP            ;ポインタ設定
  97. GETCMD2:
  98.     CMP    [BYTE SI],0DH
  99.     JE    GETCMD5            ;最後の処理へ
  100.  
  101.     CMP    [BYTE SI],20H
  102.     JE    GETCMD3            ;飛ばし処理へ
  103.  
  104.     INC    SI
  105.  
  106.     JMP    GETCMD2
  107.  
  108. GETCMD3:
  109.     MOV    [BYTE SI],00H
  110.     INC    SI            ;まずヌル入れ
  111. GETCMD4:
  112.     CMP    [BYTE SI],0DH
  113.     JE    GETCMD5            ;最後の処理へ
  114.     CMP    [BYTE SI],20H
  115.     JNE    GETCMDP            ;スペースじゃなかったら帰る
  116.  
  117.     INC    SI
  118.     JMP    GETCMD4            ;スペースだったら移動してまた調べる
  119.  
  120. GETCMD5:
  121.     MOV    [BYTE SI],00H        ;埋め込んで終わり
  122.  
  123.     XOR    BX,BX
  124.     MOV    DX,0FFFFH        ;書いていない時の為
  125. READCMD:
  126.     CMP    BP,BX
  127.     JE    READEND            ;EndOfCMD
  128.  
  129.     MOV    DI,[WORD CMDPOINTER+BX]
  130.     CMP    [BYTE DI],"-"
  131.     JE    OP_READ
  132.     CMP    [BYTE DI],"/"
  133.     JE    OP_READ            ;各々オプションの読み取りへ
  134.  
  135.     MOV    DX,DI            ;ファイル名と判断する
  136.  
  137. COMEREAD:
  138.     INC    BX
  139.     INC    BX
  140.     JMP    READCMD            ;ポインタ移動して終了
  141.  
  142. OP_READ:
  143.     JMP    COMEREAD        ;現行、オプション無し
  144.  
  145. READEND:
  146.     RET
  147.  
  148. ENDP    GETCMD
  149.  
  150.  
  151. ;****************************************
  152. ;    検索本体
  153. ;
  154. ;IN    NOWPATH DIRECTORY
  155. ;OUT    
  156. ;BREAK    
  157. ;****************************************
  158. PROC    SIR
  159.  
  160.     MOV    SI,OFFSET NOWPATH
  161.     MOV    DI,OFFSET SIRPATH
  162.     CALL    STRCPY            ;コピー
  163.  
  164.     MOV    SI,OFFSET SIRPATH
  165.     MOV    DI,OFFSET WILD
  166.     CALL    STRCAT            ;パスを作る
  167.  
  168.     MOV    AH,4EH
  169.     MOV    DX,OFFSET SIRPATH
  170.     MOV    CX,06H
  171.     INT    21H            ;それを検索
  172.  
  173.     JC    DIRE            ;無かったら下位ディレクトリ検査
  174.     JMP    FS_PUTS            ;次のループへ、途中から参入
  175.  
  176. FS_LOOP:
  177.     MOV    AH,4FH
  178.     INT    21H            ;続きの検索
  179.  
  180.     JC    DIRE            ;他に無かったら下位ディレクトリ検査
  181.  
  182. FS_PUTS:
  183.     MOV    DI,OFFSET NOWPATH
  184.     CALL    ASCIIZPUTS        ;パス名
  185.     MOV    DI,OFFSET DTA+1EH
  186.     CALL    ASCIIZPUTS        ;ファイル名
  187.     MOV    DI,OFFSET RETURN
  188.     CALL    ASCIIZPUTS        ;改行、を出力する
  189.  
  190.     INC    [WORD LOOKFOR]        ;チェック
  191.  
  192.     JMP    FS_LOOP            ;戻る
  193.  
  194. DIRE:
  195.     MOV    SI,OFFSET NOWPATH
  196.     MOV    DI,OFFSET SIRPATH
  197.     CALL    STRCPY            ;コピー
  198.  
  199.     MOV    SI,OFFSET SIRPATH
  200.     MOV    DI,OFFSET DIR
  201.     CALL    STRCAT            ;パスを作る
  202.  
  203.     MOV    AH,4EH
  204.     MOV    DX,OFFSET SIRPATH
  205.     MOV    CX,16H
  206.     INT    21H            ;今度はディレクトリ
  207.  
  208.     JC    SIRRET            ;無かったら退散
  209.  
  210.     PUSH    BX            ;保存
  211.     JMP    SIR2
  212.  
  213. SIR1:
  214.     MOV    AH,4FH
  215.     INT    21H            ;続
  216.  
  217.     JC    SIR3            ;他に無かったら移る準備
  218.  
  219. SIR2:
  220.     INC    [WORD COUNT]        ;仮カウント
  221.  
  222.     CMP    [BYTE DTA+15H],10H
  223.     JNE    SIR1            ;ディレクトリか否か
  224.  
  225.     DEC    [WORD COUNT]        ;ディレクトリだったらチャイ
  226.  
  227.     MOV    DI,BX            ;汎用バッファの終点をBXにしている
  228.     MOV    SI,OFFSET DTA+1EH
  229.     CALL    STRCPY
  230.     MOV    BX,DI            ;発見したディレクトリをバッファにコピー
  231.  
  232.     JMP    SIR1            ;戻る
  233.  
  234. SIR3:
  235.     MOV    [BYTE BX],NULL
  236.     INC    BX            ;バッファの最終位置ポインタ
  237.     POP    BP            ;サブディレクトリバッファの最初
  238.  
  239. NEST:
  240.     CMP    [BYTE BP],NULL
  241.     JE    SIRRET            ;終了サイン
  242.     CMP    [BYTE BP],"."
  243.     JE    COME            ;抜かし
  244.  
  245.     MOV    DI,BP
  246.     MOV    BP,OFFSET NOWPATH
  247.     CALL    STRLEN
  248.     PUSH    BP            ;前のパスを復元するための準備
  249.     MOV    BP,DI            ;この辺は汚いが、稼働している
  250.  
  251.     MOV    SI,OFFSET NOWPATH
  252.     MOV    DI,BP
  253.     CALL    STRCAT            ;パスを作る(上パスのみ)
  254.     MOV    SI,OFFSET NOWPATH
  255.     MOV    DI,OFFSET YEN
  256.     CALL    STRCAT            ;パスを作る(¥)
  257.  
  258.     PUSH    BP            ;調べているディレクトリを保存
  259.     PUSH    BX            ;サブルーチン用汎用バッファの保存
  260.     CALL    SIR            ;自分を呼んでいる
  261.     POP    BX            ;その復元
  262.     POP    BP
  263.  
  264.     POP    DI            ;作ったパスの分解
  265.     MOV    [BYTE DI],NULL        ;前のパスを復元
  266.  
  267. COME:
  268.     CALL    STRLEN
  269.     INC    BP            ;次のディレクトリに移る
  270.     JMP    NEST            ;戻る
  271.  
  272. SIRRET:
  273.     RET
  274.  
  275. ENDP
  276.  
  277. ;***********************************************
  278. ; 終了メッセージの表示
  279. ;    in : [WORD LOOKFOR]
  280. ;   out : CONSOLE
  281. ; break : ?
  282. ;  call : PUT16BIT
  283. ;***********************************************
  284. PROC    E_PUTS
  285.  
  286.     MOV    AH,09H
  287.     MOV    DX,OFFSET E_MES1
  288.     INT    21H
  289.  
  290.     MOV    CX,[WORD COUNT]
  291.     CALL    PUT16BIT
  292.  
  293.     MOV    AH,09H
  294.     MOV    DX,OFFSET E_MES2
  295.     INT    21H
  296.  
  297.     MOV    CX,[WORD LOOKFOR]
  298.     CALL    PUT16BIT
  299.  
  300.     MOV    AH,09H
  301.     MOV    DX,OFFSET E_MES3
  302.     INT    21H
  303.  
  304.     RET
  305.  
  306. ENDP
  307.  
  308. ;***********************************************
  309. ; パスとワイルドカードに分離
  310. ;    in : COMMAND LINE,DX
  311. ;   out : [DS:WILD]~,[NOWLINE]~
  312. ; break : ?
  313. ;  call : None
  314. ;***********************************************
  315. PROC    WAKERU
  316.  
  317.     MOV    BP,DX
  318.     MOV    SI,0FFFFH
  319. @@_1:
  320.     CMP    [BYTE BP],"\"
  321.     JE    @@_2
  322.     CMP    [BYTE BP],":"
  323.     JE    @@_2
  324.     CMP    [BYTE BP],NULL
  325.     JE    @@_3
  326.     INC    BP
  327.     JMP    @@_1
  328.  
  329. @@_2:
  330.     MOV    SI,BP
  331.     INC    BP
  332.     JMP    @@_1
  333.  
  334. @@_3:
  335.     CMP    SI,0FFFFH
  336.     JE    @@_4
  337.  
  338.     PUSH    SI
  339.     CMP    [BYTE SI],":"
  340.     JE    @@_5
  341.     MOV    [BYTE SI],NULL
  342.     MOV    SI,DX
  343.     MOV    DI,OFFSET NOWPATH
  344.     CALL    STRCPY
  345.     MOV    SI,OFFSET NOWPATH
  346.     MOV    DI,OFFSET YEN
  347.     CALL    STRCAT            ;パスを作る(¥)
  348. @@_COME:
  349.     POP    SI
  350.     INC    SI
  351.  
  352.     CMP    [BYTE SI],NULL
  353.     JNE    @@_COME2
  354.  
  355.     MOV    SI,OFFSET DIR
  356. @@_COME2:
  357.     MOV    DI,OFFSET WILD
  358.     CALL    STRCPY
  359.  
  360.     JMP    @@_RET
  361.  
  362. @@_4:
  363.     MOV    [BYTE NOWPATH],NULL
  364.     MOV    SI,DX
  365.     MOV    DI,OFFSET WILD
  366.     CALL    STRCPY
  367.  
  368. @@_RET:
  369.     RET
  370.  
  371. @@_5:
  372.     MOV    AL,[BYTE SI-1]
  373.     MOV    [BYTE NOWPATH],AL
  374.     MOV    [BYTE NOWPATH+1],":"
  375.     MOV    [BYTE NOWPATH+2],NULL
  376.  
  377.     JMP    @@_COME
  378.  
  379. ENDP
  380.  
  381. ;***********************************************
  382. ; ストリングのコピー
  383. ;    in : [DS:SI]~
  384. ;   out : [ES:DI]~
  385. ; break : AL
  386. ;  call : NO
  387. ;***********************************************
  388. PROC    STRCPY
  389. STRCPY1:
  390.     LODSB
  391.     STOSB
  392.     CMP    AL,00H
  393.     JNE    STRCPY1
  394. STRCPY2:
  395.     RET
  396.  
  397. ENDP
  398.  
  399. ;***********************************************
  400. ; ストリングの接続
  401. ;    in : ES,DI,DS,SI
  402. ;   out : [ES:DI]~,[DS:SI]~
  403. ; break : AL
  404. ;  call : NO
  405. ;***********************************************
  406. PROC    STRCAT
  407.  
  408. STRCAT1:
  409.     LODSB
  410.     CMP    AL,00H
  411.     JNE    STRCAT1
  412.  
  413.     MOV    AX,SI
  414.     MOV    SI,DI
  415.     MOV    DI,AX
  416.     DEC    DI    ;オーバーラン
  417. STRCAT2:
  418.     LODSB
  419.     STOSB
  420.     CMP    AL,00H
  421.     JNE    STRCAT2
  422.  
  423.     RET
  424.  
  425. ENDP
  426.  
  427. ;***********************************************
  428. ; 文字列の表示
  429. ;    in : [DS:DI]~
  430. ;   out : CONSOLE,BP
  431. ; break : 
  432. ;  call : 
  433. ;***********************************************
  434. PROC    ASCIIZPUTS
  435.     XOR    BP,BP
  436.     MOV    AH,02
  437. ASCIIZPUTS2:
  438.     CMP    [BYTE DS:DI+BP],00H
  439.     JE    ASCIIZPUTS_END
  440.     MOV    DL,[BYTE DS:DI+BP]
  441.     INT    21H
  442.     INC    BP
  443.     JMP    ASCIIZPUTS2
  444. ASCIIZPUTS_END:
  445.     RET
  446.  
  447. ENDP
  448.  
  449. ;***********************************************
  450. ; 文字列の最後の場所に移動
  451. ;    in : BP
  452. ;   out :
  453. ; break :
  454. ;  call : NO
  455. ;***********************************************
  456. PROC    STRLEN
  457.  
  458. STRLEN2:
  459.     CMP    [BYTE DS:BP],00H
  460.     JE    STRLEN_END
  461.     INC    BP
  462.     JMP    STRLEN2
  463. STRLEN_END:
  464.     RET            ;このサブルーチンの名前は関係ない
  465.     ENDP
  466.  
  467.  
  468. ;////////////////////
  469. ;    16ビット自然数の書き出し
  470. ;
  471. ;        CXを書く
  472. ;
  473. ;    AX、BX、CX、DXが壊れる
  474. ;////////////////////
  475. PROC    PUT16BIT
  476.  
  477.     XOR    BP,BP
  478. @@_1:
  479.     MOV    AX,CX
  480.     XOR    DX,DX
  481.     MOV    BX,10000
  482.     DIV    BX
  483.     MOV    BL,AL
  484.     CMP    AL,0
  485.     JE    @@_2
  486.     INC    BP
  487. @@_2:
  488.     CMP    BP,0
  489.     JE    @@_2B
  490.     ADD    AL,30H
  491.     MOV    DL,AL
  492.     MOV    AH,02H
  493.     INT    21H
  494.     XOR    DX,DX
  495.     XOR    AH,AH        ;BUG FIXED 92/06/10
  496. @@_2B:
  497.     MOV    AL,BL
  498.     MOV    BX,10000
  499.     MUL    BX
  500.     SUB    CX,AX
  501.  
  502.     MOV    AX,CX
  503.     MOV    BX,1000
  504.     DIV    BX
  505.     MOV    BL,AL
  506.     CMP    AL,0
  507.     JE    @@_3
  508.     INC    BP
  509. @@_3:
  510.     CMP    BP,0
  511.     JE    @@_3B
  512.     ADD    AL,30H
  513.     MOV    DL,AL
  514.     MOV    AH,02H
  515.     INT    21H
  516.     XOR    DX,DX
  517.     XOR    AH,AH        ;BUG FIXED 92/06/10
  518. @@_3B:
  519.     MOV    AL,BL
  520.     MOV    BX,1000
  521.     MUL    BX
  522.     SUB    CX,AX
  523.  
  524.     MOV    AX,CX
  525.     MOV    BX,100
  526.     DIV    BX
  527.     MOV    BL,AL
  528.     CMP    AL,0
  529.     JE    @@_4
  530.     INC    BP
  531. @@_4:
  532.     CMP    BP,0
  533.     JE    @@_4B
  534.     ADD    AL,30H
  535.     MOV    DL,AL
  536.     MOV    AH,02H
  537.     INT    21H
  538.     XOR    DX,DX
  539.     XOR    AH,AH        ;BUG FIXED 92/06/10
  540. @@_4B:
  541.     MOV    AL,BL
  542.     MOV    BX,100
  543.     MUL    BX
  544.     SUB    CX,AX
  545.  
  546.     MOV    AX,CX
  547.     MOV    BX,10
  548.     DIV    BX
  549.     MOV    BL,AL
  550.     CMP    AL,0
  551.     JE    @@_5
  552.     INC    BP
  553. @@_5:
  554.     CMP    BP,0
  555.     JE    @@_5B
  556.     ADD    AL,30H
  557.     MOV    DL,AL
  558.     MOV    AH,02H
  559.     INT    21H
  560.     XOR    DX,DX
  561.     XOR    AH,AH        ;BUG FIXED 92/06/10
  562. @@_5B:
  563.     MOV    AL,BL
  564.     MOV    BX,10
  565.     MUL    BX
  566.     SUB    CX,AX
  567.  
  568.     MOV    AX,CX
  569.     ADD    AL,30H
  570.     MOV    DL,AL
  571.     MOV    AH,02H
  572.     INT    21H
  573.     XOR    DX,DX
  574.  
  575.     RET            ;冗長…
  576.  
  577. ENDP
  578.  
  579. ;****************************************
  580. ;    初期化済データ部
  581. ;****************************************
  582. NOF_MES:
  583.     DB    " 該当ファイルが有りません。",CR,"$"
  584. YEN:
  585.     DB    "\",NULL            ;パスの区切り
  586. RETURN:
  587.     DB    CR,NULL                ;改行
  588. DIR:
  589.     DB    "*.*",NULL            ;ディレクトリ検索用
  590. LOOKFOR:
  591.     DW    00H
  592. E_MES1:
  593.     DB    CR," 該当ファイルは","$"
  594. E_MES2:
  595.     DB    "個中","$"
  596. E_MES3:
  597.     DB    "個です。",CR,"$"
  598. COUNT:
  599.     DW    0
  600.  
  601. ;****************************************
  602. ;    非初期化データ部
  603. ;****************************************
  604.  
  605. CMDPOINTER:
  606.     DW    64 DUP(?)    ;コマンドラインポインタ
  607.  
  608. WILD:
  609.     DB    80H DUP(?)    ;ワイルドカード?
  610.  
  611. NOWPATH:
  612.     DB    80H DUP(?)    ;検索中のディレクトリ
  613.  
  614. SIRPATH:
  615.     DB    80H DUP(?)    ;検索時のワイルドカード用テンポラリ
  616.  
  617. RNDBUF:
  618.                 ;はみ出るチェックはしていない。スタックとの衝突
  619.                 ;で、事実上、処理オーバーとなる(いい加減?)。
  620. ENDS    CODE
  621. END    ENTRY
  622.